/*This file is part of jasmo.

jasmo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

jasmo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with jasmo.  If not, see <http://www.gnu.org/licenses/>.*/

package com.lab9.jasmo.service;

import java.util.Date;

import org.apache.log4j.Logger;

import com.lab9.jasmo.domain.IAction;
import com.lab9.jasmo.domain.IMonitoredService;
import com.lab9.jasmo.domain.ProbeResult;
import com.lab9.jasmo.domain.ServiceState;

public class MonitoredServiceRunnable implements Runnable {
	private static Logger logger = Logger.getLogger(MonitoredServiceRunnable.class);
	
	private IMonitoredService monitoredService;
	
	public MonitoredServiceRunnable(IMonitoredService monitoredService) {
		this.monitoredService = monitoredService;
	}
	
	@Override
	public void run() {
		logger.info("ENTERING - run()");
		
		// remember old state
		ServiceState oldState = monitoredService.State();
		
		// set to probing
		monitoredService.UpdateState(ServiceState.PROBING, new Date(), "");
		
		logger.info("start probe of service " + monitoredService);
		// probe the service
		ProbeResult result = monitoredService.Probe();
		logger.info("finished probe of service " + monitoredService + "; result = " + result);
		
		// set new state
		ServiceState newState = result.State();
		
		// update the state
		monitoredService.UpdateState(newState, new Date(), result.Message());
		
		if ( oldState != newState) {
			// execute all actions
			for(IAction action : monitoredService.Actions()) {
				action.StateChanged(monitoredService, oldState, newState);
			}
		}
		logger.info("EXITING - run()");
	}

}
